/*DDL触发器用于数据定义语言，DDL触发器用于数据操作语言
触发器被创建后，默认为启用状态*/
--创建不允许在当前数据库中执行DROP TABLE操作的触发器t1
CREATE TRIGGER t1 ON DATABASE FOR DROP_TABLE AS BEGIN
PRINT 'You can not drop table from this database.'
ROLLBACK
END
GO
--修改触发器t1为不允许在当前数据库中执行和ALTER TABLE和DROP TABLE操作
ALTER TRIGGER t1
ON DATABASE AFTER ALTER_TABLE,DROP_TABLE AS BEGIN
PRINT 'You can not drop table or alter table from this database.'
ROLLBACK
END
GO
--禁用DDL触发器t1
DISABLE TRIGGER t1 ON DATABASE
GO
--启用DDL触发器t1（删除触发器时须了解该触发器的作用域是DATABASE还是ALL SERVER，否则将无法顺利删除）
ENABLE TRIGGER t1 ON DATABASE
GO
--在启用触发器t1的情况下尝试删除数据表scores
DROP TABLE scores
GO
--在当前数据库中删除DDL触发器t1
DROP TRIGGER t1 ON DATABASE
GO
--创建不允许修改users表中sex列的值的触发器t2
CREATE TRIGGER t2 ON users FOR UPDATE AS BEGIN
IF (SELECT sex FROM inserted)<>(SELECT sex FROM deleted) OR(SELECT sex FROM inserted)=(SELECT sex FROM deleted) BEGIN
PRINT '你不能对users表中sex列的任何值进行UPDATE操作'
ROLLBACK
END
END
GO
--禁用DML触发器t2
DISABLE TRIGGER t2 ON scores
GO
--启用DML触发器t2
ENABLE TRIGGER t2 ON users
GO
--在启用触发器t2的情况下尝试修改users表中uid=1所在行的sex列的值
UPDATE users SET sex='sex' WHERE uid=1
GO
/*UPDATE(column1)函数是一个触发器函数（column1表示该触发器引用的表的某个列名）
UPDATE函数用于检测是否对表或视图的指定列执行了INSERT或UPDATE操作，返回值是boolean类型*/
--修改触发器t2为不允许修改users表中sex列的值和不允许将birth列的值修改为早于1960年1月1日
ALTER TRIGGER t2 ON users FOR UPDATE AS BEGIN
IF UPDATE(sex) BEGIN
PRINT '你不能对users表中sex列的任何值进行UPDATE操作'
ROLLBACK
END
IF (SELECT birth FROM inserted) NOT BETWEEN '1985-01-01' AND '1989-12-31' BEGIN
PRINT 'birth列的值不能早于1985年或晚于1989年'
ROLLBACK
END
END
GO
--在启用触发器t2的情况下尝试修改users表中uid=6所在行的birth列的值
UPDATE users SET birth='1970-01-01' WHERE uid=6
GO
--在当前数据库中删除DML触发器t2
DROP TRIGGER t2
GO
